package com.ato.java;

/**
 * @author wangjing
 * @create 2021--08--03--22:26
 */
public class BlockTest {
    public static void main(String[] args) {
        String desc = P.desc;  // static的直接对象调用，此时，静态代码块自己随着类的加载而自己执行了。不需要你调用
        P p1 = new P();  //  非静态代码块，随着对象的加载而自动执行。

    }
}

class P {
    String name;
    int age;
    static String desc;
    public P() {
    }
    public void eat() {
        System.out.println("非静态方法");
    }
    public  static  void  walk (){
        System.out.println("静态方法");

    }
//    代码块

    /**
     * 1：作用：用来初始化类或者对象
     * 2：只能使用static 来修饰。 static { }  或者直接 { }
     * 3：分类：静态代码块：含有static{}
     *                  内部可以有输出语句
     *                  调用方式：随着类的加载而执行：只要加载了类，代码块就会直接自己自动执行了。不需要去调用
     *                  只会执行一次
     *                  作用：初始化类的信息 ，只能调用静态方法或者属性
     *         非静态代码块：{}
     *                  内部可以有输出语句
     *                  随着对象的加载而自动执行。
     *                  创建对个对象就执行多次
     *                  作用：初始化对象的属性值，可以调用静态，非静态的属性和方法
     * 4：实际使用：  可以添加多个，根据位置进行加载，静态的优先于非静态的
     */
    static {
        System.out.println("静态代码块");
        desc = "静态代码块中对类的属性赋值";
        walk();
    }

    {
        System.out.println("非静态代码块");
        name = "非静态代码块中队对象的属性值赋值";
        eat();
    }
}
